home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / ltmf_120.lzh / LTMF_FMD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-18  |  8.3 KB  |  305 lines

  1. /* ------------------------------------------------------------------------- */
  2. /* ----- Let 'em Fly!   V 1.2 ----------- (c) 1991-93 by Oliver Scheel ----- */
  3. /* ------------------------------------------------------------------------- */
  4. /* ----- Module: ltmf_fmd.c   new form_dial()  new form_center() ----------- */
  5. /* ------------------------------------------------------------------------- */
  6.  
  7. #include <stdio.h>
  8. #include <macros.h>
  9. #include <smallaes.h>
  10. #include <vdi.h>
  11. #include <tos.h>
  12. #include <portab.h>
  13.  
  14. #include <mxmalloc.h>
  15. #include "ltmf_str.h"
  16. #include "ltmf_def.h"
  17.  
  18. /* ------------------------------------------------------------------------- */
  19.  
  20. extern    int    vwk_handle;
  21. extern    int    planes;
  22.  
  23. extern    GRECT    wi_max;
  24. extern    int    gl_wchar,
  25.         gl_hchar;
  26.  
  27. extern    DIALSAV    dsave[];
  28. extern    int    dialno;
  29.  
  30. extern    OBJECT    *lasttree;
  31. extern    OBJECT    *lastdone;
  32.  
  33. extern    int    initflag;
  34.  
  35. extern    int    magic;
  36. extern    int    isalert;
  37. extern    int    istrans;
  38.  
  39. /* ------------------------------------------------------------------------- */
  40.  
  41. VSCRINF    *vscr = NULL;
  42.  
  43. void    *alertbuf;
  44. long    almemsize;
  45.  
  46. int    was_used;
  47.  
  48. /* ------------------------------------------------------------------------- */
  49.  
  50. int vwk_init(void);
  51. void vwk_exit(int handle);
  52. void obj_xywh(OBJECT *tree, int obj, GRECT *p);
  53. void cdecl obj_clsize(OBJECT *tree, int obj, int *x, int *y, int *w, int *h);
  54. void rc_copy(void *src, void *dest);
  55. void rc_vtog(VRECT *src, GRECT *dest);
  56. int ltmf_init(void);
  57.  
  58. /* ------------------------------------------------------------------------- */
  59. /* ----- new form_dial() --------------------------------------------------- */
  60. /* ------------------------------------------------------------------------- */
  61.  
  62. void _send_redraw(VRECT *vr, int w, int h)
  63. {
  64.     GRECT    gr;
  65.  
  66.     rc_vtog(vr, &gr);
  67.     gr.g_x -= (w - gr.g_w) / 2;
  68.     gr.g_y -= (h - gr.g_h) / 2;
  69.     form_dial(FMD_FINISH, 0, 0, 0, 0, gr.g_x, gr.g_y, w, h);
  70. }
  71.  
  72. /* ------------------------------------------------------------------------- */
  73.  
  74. int nfm_dial(flag, xs, ys, ws, hs, x, y, w, h)
  75. int    flag,
  76.     xs, ys, ws, hs,
  77.     x, y, w, h;
  78. {
  79.     VRECT    vr[2];
  80.     DIALSAV    *dsav;
  81.     int    wbufladr, wbufhadr,
  82.         wbufllen, wbufhlen;
  83.     long    msize;
  84.  
  85.     if(!initflag)
  86.         ltmf_init();
  87.     switch(flag)
  88.     {
  89.         case FMD_GROW :
  90.         case FMD_SHRINK :
  91.             return((letemfly.conf & C_F_GROW) ? form_dial(flag, xs, ys, ws, hs, x, y, w, h) : 1);
  92.         case FMD_START :
  93. /*            if(!istrans)
  94.                 lastdone = NULL;
  95. */            if(++dialno < MAXDIAL)
  96.             {
  97.                 if(!istrans)
  98.                     was_used = FALSE;
  99.                 dsav = &dsave[dialno];
  100.                 wind_get(0, WF_WORKXYWH, &wi_max.g_x, &wi_max.g_y, &wi_max.g_w, &wi_max.g_h);
  101.                 x = max(x, wi_max.g_x);
  102.                 y = max(y, wi_max.g_y);
  103.                 w = min(w, wi_max.g_w);
  104.                 h = min(h, wi_max.g_h);
  105.                 vr[0].v_x1 = x;
  106.                 vr[0].v_y1 = y;
  107.                 vr[0].v_x2 = x + w - 1;
  108.                 vr[0].v_y2 = y + h - 1;
  109.                 rc_copy(&vr[0], &dsav->dpos);
  110.                 if(((letemfly.conf & C_FLY) || isalert) && (h > 0) && (w > 0))
  111.                 {
  112.                     vwk_handle = vwk_init();
  113.                     dsav->mem.fd_wdwidth = (w + 32) / 16;
  114.                     dsav->mem.fd_w = dsav->mem.fd_wdwidth * 16;
  115.                     dsav->mem.fd_h = h + 1;
  116.                     dsav->msize = ((long)dsav->mem.fd_wdwidth * (long)dsav->mem.fd_h * (long)planes * 2l);
  117.                     msize = isalert ? 8192l : (long)MxMalloc(-1l);
  118.                     if((dsav->msize < msize) || isalert)
  119.                     {
  120.                         if(isalert)
  121.                         {
  122.                             wind_get(0, WF_SCREEN, &wbufhadr, &wbufladr, &wbufhlen, &wbufllen);
  123.                             alertbuf = (void *)((wbufladr & 0x0000ffff) + ((long)wbufhadr << 16));
  124.                             dsav->mem.fd_addr = alertbuf;
  125.                         }
  126.                         else
  127.                             dsav->mem.fd_addr = MxMalloc(dsav->msize);
  128.                         dsav->mem.fd_nplanes = planes;
  129.                         dsav->mem.fd_stand = 0;
  130.                         dsav->dial.fd_addr = NULL;    
  131.                         vr[1].v_x1 = vr[0].v_x1 & 0x0f;
  132.                         vr[1].v_y1 = 0;
  133.                         vr[1].v_x2 = vr[1].v_x1 + w - 1;
  134.                         vr[1].v_y2 = h - 1;
  135.                         rc_copy(&vr[1], &dsav->mpos);
  136.                         graf_mouse(M_OFF, 0l);
  137.                         wind_update(BEG_UPDATE);
  138.                         vs_clip(vwk_handle, 0, &dsav->dpos);
  139.                         vro_cpyfm(vwk_handle, S_ONLY, vr,
  140.                             &dsav->dial, &dsav->mem);
  141.                         wind_update(END_UPDATE);
  142.                         graf_mouse(M_ON, 0l);
  143.                         vwk_exit(vwk_handle);
  144.                         if(letemfly.conf & C_REDRAW)
  145.                             return(form_dial(flag, xs, ys, ws, hs, x, y, w, h));
  146.                         else
  147.                             return(1);
  148.                     }
  149.                     vwk_exit(vwk_handle);
  150.                 }
  151.                 else
  152.                     dsav->mem.fd_addr = NULL;
  153.             }
  154.             return(form_dial(flag, xs, ys, ws, hs, x, y, w, h));
  155.         case FMD_FINISH :
  156.             if(!istrans)
  157.                 lastdone = NULL;
  158.             if(dialno == -1)
  159.                 break;
  160.             if(dialno < MAXDIAL)
  161.             {
  162.                 dsav = &dsave[dialno--];
  163.                 if(dsav->mem.fd_addr == NULL)
  164.                 {
  165.                     _send_redraw(&dsav->dpos, w, h);
  166.                     return(1);
  167.                 }
  168.                 else if(lasttree)
  169.                 {
  170.                     Mfree(dsav->mem.fd_addr);
  171.                     dsav->mem.fd_addr = NULL;
  172.                     break;
  173.                 }
  174.                 else
  175.                 {
  176.                     rc_copy(&dsav->mpos, &vr[0]);
  177.                     rc_copy(&dsav->dpos, &vr[1]);
  178.                     vwk_handle = vwk_init();
  179.                     graf_mouse(M_OFF, 0l);
  180.                     wind_update(BEG_UPDATE);
  181.                     vs_clip(vwk_handle, 0, &dsav->dpos);
  182.                     vro_cpyfm(vwk_handle, S_ONLY, vr,
  183.                         &dsav->mem, &dsav->dial);
  184.                     wind_update(END_UPDATE);
  185.                     graf_mouse(M_ON, 0l);
  186.                     vwk_exit(vwk_handle);
  187. #ifndef LIGHT
  188.                     if(!isalert)
  189. #endif
  190.                         Mfree(dsav->mem.fd_addr);
  191.                     dsav->mem.fd_addr = NULL;
  192.                     if(!isalert && !istrans && ((letemfly.conf & C_REDRAW) || !was_used))
  193.                         _send_redraw(&dsav->dpos, w, h);
  194.                     return(1);
  195.                 }
  196.             }
  197.     }
  198.     return(form_dial(flag, xs, ys, ws, hs, x, y, w, h));
  199. }
  200.  
  201. /* ------------------------------------------------------------------------- */
  202. /* ----- new form_center() ------------------------------------------------- */
  203. /* ------------------------------------------------------------------------- */
  204.  
  205. void _mouse_center(OBJECT *tree, GRECT *gr, int *mx, int *my)
  206. {
  207.     int    snap;
  208.  
  209.     snap = (magic && (tree->ob_flags & SNAPIN)) ? TRUE : FALSE;
  210.     *mx -= gr->g_w / 2;
  211.     if(*mx < (wi_max.g_x + gl_wchar/2))
  212.         *mx = wi_max.g_x + gl_wchar/2;
  213.     else if((*mx + gr->g_w) > (wi_max.g_w - gl_wchar /* /2 */))    /* !!!! */
  214.         *mx = wi_max.g_w - gl_wchar /* /2 */ - gr->g_w;
  215.     *my -= gr->g_h / 2;
  216.     if(*my < (wi_max.g_y + 4))
  217.         *my = wi_max.g_y + 4;
  218.     else if((*my + gr->g_h) > (wi_max.g_y + wi_max.g_h - gl_hchar/2))
  219.         *my = (wi_max.g_y + wi_max.g_h - gl_hchar/2) - gr->g_h;
  220.     if(snap)
  221.     {
  222.         *mx = (*mx & 0xfff8) | (gr->g_x & 0x07);
  223.         if((*mx + gr->g_w) > (wi_max.g_x + wi_max.g_w))
  224.             *mx -= 8;
  225.     }
  226. }
  227.  
  228. /* ------------------------------------------------------------------------- */
  229.  
  230. int nfm_center(tree, x, y, w, h)
  231. OBJECT    *tree;
  232. int    *x, *y,
  233.     *w, *h;
  234. {
  235.     int    xsav, ysav,
  236.         obtyp,
  237.         obflag,
  238.         d, ks;
  239.     int    mx, my;
  240.     GRECT    gr;
  241.  
  242.     graf_mkstate(&mx, &my, &d, &ks);
  243.     obtyp = tree->ob_type & 0xff00;
  244.     obflag = tree->ob_flags;
  245.     magic = ((unsigned int)obtyp == MAGIC) ? TRUE : FALSE;
  246.     if(!initflag)
  247.         ltmf_init();
  248.     wind_get(0, WF_WORKXYWH, &wi_max.g_x, &wi_max.g_y, &wi_max.g_w, &wi_max.g_h);
  249.     if((letemfly.conf & C_MOUSE) && (lasttree != tree))
  250.     {
  251. /*        obj_xywh(tree, ROOT, &gr);
  252. */        obj_clsize(tree, ROOT, &gr.g_x, &gr.g_y, &gr.g_w, &gr.g_h);
  253.         _mouse_center(tree, &gr, &mx, &my);
  254.         tree->ob_x = (mx + 8) & 0xfff8;
  255.         tree->ob_y = (my + 8) & 0xfff8;
  256.     }
  257.     xsav = tree->ob_x;
  258.     ysav = tree->ob_y;
  259.     form_center(tree, x, y, w, h);
  260.     if((letemfly.conf & (C_CENTER|C_MOUSE)) && !(obtyp == GLOBOFF)
  261.         && !(magic && (obflag & FRCCENT)))
  262.     {
  263.         if(((obflag & CENTER) || (letemfly.conf & C_MOUSE)) && (ks ^ (K_ALT|K_CTRL)))
  264.         {
  265.             if((xsav > wi_max.g_x) && (ysav > wi_max.g_y)
  266.                 && ((xsav + tree->ob_width) < (wi_max.g_x + wi_max.g_w))
  267.                 && ((ysav + tree->ob_height) < (wi_max.g_y + wi_max.g_h)))
  268.             {
  269.                 *x += xsav - tree->ob_x;
  270.                 *y += ysav - tree->ob_y;
  271.                 tree->ob_x = xsav;
  272.                 tree->ob_y = ysav;
  273.                 return(1);
  274.             }
  275.         }
  276.         else
  277.             tree->ob_flags |= CENTER;
  278.     }
  279.     if(vscr && ((letemfly.conf & C_VSCR) || isalert))
  280.     {
  281.         if(vscr->cookie == 'VSCR')
  282.         {
  283.             xsav = tree->ob_x;
  284.             ysav = tree->ob_y;
  285.             tree->ob_x = vscr->x + (vscr->w - tree->ob_width) / 2;
  286.             tree->ob_y = vscr->y + (vscr->h - tree->ob_height) / 2;
  287. /*            tree->ob_x = max(vscr->x, wi_max.g_x) + (vscr->w - tree->ob_width) / 2;
  288.             tree->ob_y = max(vscr->y, wi_max.g_y) + (vscr->h - tree->ob_height) / 2;
  289. */            *x += tree->ob_x - xsav;
  290.             *y += tree->ob_y - ysav;
  291.             if(*x < wi_max.g_x)
  292.             {
  293.                 *w -= wi_max.g_x - *x;
  294.                 *x = wi_max.g_x;
  295.             }
  296.             if(*y < wi_max.g_y)
  297.             {
  298.                 *h -= wi_max.g_y - *y;
  299.                 *y = wi_max.g_y;
  300.             }
  301.         }
  302.     }
  303.     return(1);
  304. }
  305.